Como ya se ha explicado, el código original de Object_Freezer provee una clase abstracta para el almacenamiento de objetos congelados, más una implementación en CouchDB. Las grandes diferencias entre este gestor de bases de datos y las relacionales, y la gran similitud entre éstas nos hace pensar en una capa intermedia, que establezca los criterios básicos para almacenar objetos congelados en bases de datos relacionales, haciendo uso de las implementaciones particulares para cada RDBMS.
Se ha elegido implementar primero MySQL por ser un gestor de bases de datos de licencia libre, de gran rendimiento y enorme popularidad en entornos de desarrollo web, para los cuales está pensado Object Freezer.
Quizá la primera decisión a tomar cuando se trabaja con MySQL es elegir el motor de almacenamiento. Si estamos trabajando con un clúster MySQL deberemos utilizar NDB, aunque la versión actual de nuestra biblioteca no lo permite. En la mayor parte de casos se trabaja con un sólo servidor, utilizando bien MyISAM bien InnoDB, según sean las necesidades del producto (a grandes rasgos, más velocidad o más integridad). Así pues, Object_Freezer-MySQL soporta ambos motores. Basta con especificarlo como parámetro del constructor y Object_Freezer utilizará tablas del motor elegido:
$storage = new Object_Freezer_RelationalStorage(
new Object_Freezer,
NULL,
FALSE,
new MysqlStorage(
"localhost", //Servidor MySQL
"freezer", //Usuario
"passw0rd", //Contraseña
"freezer", //Base de datos
3306, //Puerto
MysqlStorage::ENGINE_INNODB)); //Motor MySQL
En caso de usar InnoDB, Object_Freezer-MySQL creará, además de las tablas para objetos y propiedades, las restricciones sobre ellas para obtener integridad referencial entre objetos y propiedades (no habrá integridad referencial entre propiedades de tipo objeto debido a que la referencia se almacenan como valor de la propiedad).
Hemos visto que almacenar y recuperar objetos es fácil: basta con instanciar Object_Freezer y pasarle el objeto que queramos. Sabemos que cuando eso ocurre, por ejemplo al guardar un objeto nuevo, Object_Freezer-MySQL inserta registros en las tablas de objetos y propiedades. Pero ¿y si las tablas no existen o no tienen los campos necesarios?
Para aumentar el rendimiento, Object_Freezer-MySQL no realiza comprobaciones previas de esquemas, ya que las únicas restricciones son que las tablas existan y tengan los campos definidos en el esquema. Por ello, las comprobaciones se ejecutan cuando ocurre un error al consultar la base de datos:
if (mysql_errno($this->connection) == self::TABLE_NOT_EXISTS
|| mysql_errno($this->connection) == self::FIELD_NOT_EXISTS) {
$this->checkSchema();
}
Las comprobaciones se ejecutan con las sentencias básicas de análisis del esquema. En el código se incluyen también las sentencias necesarias para crear tablas nuevas en caso de que no existan. Si las tablas existen pero no son correctas, se aplica uno de los tres comportamientos, según se defina en la configuración: